#ifndef _DYNAMICARRAY_H_
#define _DYNAMICARRAY_H_

// size_t头文件
#include <cstddef>
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
// 定义了所有上限值
#include <limits.h>
namespace DARRAY
{

class Student;

using ElemetType = void *;

class DynamicArray
{
public:
    void SetFreeFunc(void (*Free)(ElemetType))
    {
        this->Free = Free;
    };

    void SetPrintFunc(void (*Print)(ElemetType))
    {
        this->Print = Print;
    }

    void SetCompareFunc(int (*Compare)(ElemetType, ElemetType))
    {
        this->Compare = Compare;
    }


    DynamicArray();
    DynamicArray(const DynamicArray &a);
    DynamicArray &operator=(const DynamicArray &a);
    ~DynamicArray();
    // 插入
    // 尾插法
    void InsertTail(const ElemetType &element);
    // 头插法
    void InsertHead(const ElemetType &element);
    // 中间插入
    void InsertByIndex(const ElemetType &element, size_t index);

    // 删除
    // 按位置删除
    void RemoveByIndex(size_t index);
    // 按值删除
    void RemoveByElement(const ElemetType &element);

    // 查找
    // 按位置查找
    ElemetType *FindByIndex(size_t index);
    // 按值查找
    // 返回值：下标的集合
    DynamicArray FindByElement(const ElemetType &element);

    // 修改
    // 按位修改
    void UpdateByIndex(size_t index, const ElemetType &element);

    // 按值修改
    void UpdateByElement(const ElemetType &oldelement, const ElemetType &newelement);

    // 统一了查找和修改,重载[]运算符
    ElemetType &operator[](int index);

    // 排序
    void Sort();

    // 去重算法
    void Duplicate();

    // 很重要 合并算法 两个有序数列合并成一个新的有序梳理
    DynamicArray Merge(const DynamicArray &a);

    // 取交集
    DynamicArray FdIntrSctn(const DynamicArray &a);

    // 取并集
    DynamicArray FindUnionSet(const DynamicArray &a);

    // 取补集
    DynamicArray FindDifference(const DynamicArray &a);

    // 判断两个数列是否相等
    bool operator==(const DynamicArray &a);

    // 二分查找法 没找到返回ULONG_MAX
    size_t BinarySearch(const ElemetType &element);

    // 判断一个数列是不是另一个数列的子数列
    bool Contains(const DynamicArray &a);

    //  判断一个数列是否是连续子序列
    bool ContnsContains(const DynamicArray &a);

    // 获取子序列
    DynamicArray Subsquence(size_t index, size_t len);
    void show();

private:
    // 分组函数
    size_t partition(size_t start, size_t end);
    void InsertSort(size_t start, size_t end);
    void FastSort(size_t start, size_t end, size_t CurDepth, int MaxDepth);
    void ReSize(size_t capacity);
    size_t size;
    size_t capacity;
    ElemetType *array;

    // 释放对象的函数指针
    void (*Free)(void *);
    // 比较大小的指针
    int (*Compare)(void *, void *);
    // 打印数据的指针
    void (*Print)(void *);
};
}
#endif
